//
// Created by jinling on 2025/6/24.
//


#include "TTime.h"

//表示当前的UTC时间，单位是毫秒
//这里用了gettimeofday来获得当前精确时间（1970年1月1日到现在的时间），位于头文件 #include <sys/time.h>
int64_t tmms::base::TTime::NowMS(){// #include <sys/time.h>
    struct timeval tv{};
    gettimeofday(&tv,nullptr);
    return  tv.tv_sec*1000+tv.tv_usec/1000;
}

//表示当前的UTC时间，单位是秒。
int64_t tmms::base::TTime::Now()
{
    struct  timeval tv{};
    gettimeofday(&tv,nullptr);
    return tv.tv_sec;
}


//表示当前时间，返回当前的年月日时分秒
int64_t tmms::base::TTime::Now(int &year,int &month,int &day,int &hour,int &minute,int &second)
{
    // struct timeval tv;
    // gettimeofday(&tv, nullptr);

    struct tm tm;

    time_t t = time(NULL);
   
    localtime_r(&t, &tm); // 使用获取的秒数初始化tm

    // 修正赋值逻辑（tm_mon范围0-11需+1）[1,2](@ref)
    year   = tm.tm_year + 1900; // 补上缺失的年份赋值
    month  = tm.tm_mon + 1;     // 月份范围从1-12
    day    = tm.tm_mday;
    hour   = tm.tm_hour;
    minute = tm.tm_min;
    second = tm.tm_sec;
     return t; 
     //这里用到了localtime_r，把时间转化成本地时间
}


std::string  tmms::base::TTime::ISOTime ()
{


    // struct timeval tv{};
    // struct tm tm{};

    // gettimeofday(&tv, NULL);
    // time_t t = time(NULL);

    // char buf[128] = {0};

    // auto n = sprintf(buf,"%4d-%02d-%02dT%02d:%02d:%02d",
    //     tm.tm_year + 1900,
    //     tm.tm_mon + 1, tm.tm_mday,tm.tm_hour,tm.tm_min,tm.tm_sec);

    // return std::string(buf,buf+n);

 
    struct timeval tv{};//原版的代码好像存在一些问题，可以改成下面这个
    struct tm tm{};

    gettimeofday(&tv, NULL);
    // 使用 tv.tv_sec 来填充 tm 结构体，这里也可以用 time(NULL)，效果类似，不过 gettimeofday 能获取更精确的时间起点
    localtime_r(&tv.tv_sec, &tm);  
    char buf[128] = {0};
    auto n = sprintf(buf,"%4d-%02d-%02dT%02d:%02d:%02d",
        tm.tm_year + 1900,
        tm.tm_mon + 1, tm.tm_mday,tm.tm_hour,tm.tm_min,tm.tm_sec);

    return std::string(buf,buf+n);
   
}



